<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-15">
	<TITLE>Python</TITLE>
	<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.9.104  (Linux)">
	<META NAME="AUTHOR" CONTENT="Daniele Zambelli">
	<META NAME="CREATED" CONTENT="20050115;21443800">
	<META NAME="CHANGED" CONTENT="20060222;8280100">
	<META NAME="CLASSIFICATION" CONTENT="Un'introduzione alla programmazione con il linguaggio Python">
	<META NAME="DESCRIPTION" CONTENT="Una rapida ma non banale introduzione alla programmazione cin Python">
	<META NAME="KEYWORDS" CONTENT="Python Programmazione procedurale, Programmazione funzionale, Programmazione ad oggetti">
	<STYLE>
	<!--
		@page { size: 21cm 29.7cm; margin: 2cm }
		H1 { margin-bottom: 0.21cm; color: #b84747 }
		H1.western { font-family: "Helvetica", sans-serif; font-size: 16pt }
		H1.cjk { font-family: "Mincho"; font-size: 16pt }
		H1.ctl { font-family: "Tahoma", "Lucidasans", "Lucida Sans", "Arial Unicode MS"; font-size: 16pt }
		P { margin-bottom: 0.21cm }
		P.western { font-family: "Helvetica", sans-serif; font-weight: medium }
		KBD { color: #808000 }
	-->
	</STYLE>
</HEAD>
<BODY LANG="it-IT" DIR="LTR">
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#94006b"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=7 STYLE="font-size: 44pt">Python</FONT></FONT></FONT></P>
<P CLASS="western"><BR><BR>
</P>
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#94476b"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=6 STYLE="font-size: 22pt">Introduzione
alla programmazione </FONT></FONT></FONT>
</P>
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#944794"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>(Daniele
Zambelli 2005)</FONT></FONT></FONT></P>
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#944794"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>www.verona.linux.it<BR>daniele.zambelli@inwind.it</FONT></FONT></FONT></P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm">In questo
testo una veloce introduzione<BR>alla programmazione in <KBD>Python</KBD>,<BR>alla
programmazione procedurale,<BR>funzionale e<BR>orientata agli
oggetti.</P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm">Questa
introduzione &egrave; inserita nel pacchetto <KBD>pygraph</KBD> <BR>che
contiene anche le librerie:<BR><KBD>pyturtle</KBD> per la grafica
della tartaruga, <BR><KBD>pyplot</KBD> per il disegno di funzioni
piane, <BR><KBD>pyig</KBD> per la geometria interattiva <BR>e <KBD>pycart</KBD>
la libreria che serve da base per tutte le altre.</P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm"><KBD>pygraph</KBD>
&egrave; anche inserito all'interno della distribuzione
<BR><KBD>EduKnoppix</KBD>.<BR><FONT SIZE=3><FONT FACE="Helvetica, sans-serif"><FONT COLOR="#944794">http://www.eduknoppix.org</FONT></FONT></FONT></P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<DIV ID="Indice generale1" DIR="LTR" STYLE="background: transparent">
	<P CLASS="western">0. <A HREF="#intro">Introduzione</A> <BR>1.
	<A HREF="#python">Python</A> <BR>2. <A HREF="#in-out">Input - output</A>
	<BR>3. <A HREF="#numeri">Numeri e operazioni</A> <BR>4. <A HREF="#liste">Liste</A>
	<BR>5. <A HREF="#funzioni">Funzioni definite dall'utente</A> <BR>6.
	<A HREF="#scelte">Scelte</A> <BR>7. <A HREF="#cicli">Cicli e errori
	di programmazione</A> <BR>8. <A HREF="#procedurale">Programmazione
	procedurale</A> <BR>9. <A HREF="#funzionale">Programmazione
	funzionale</A> <BR>10. <A HREF="#oggetti">Programmazione orientata
	agli oggetti</A> <BR>11. <A HREF="#licenza">Licenza</A> <BR>12.
	<A HREF="#bibliografia">Bibliografia</A> 
	</P>
</DIV>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="intro"></A>0. Introduzione</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se mi stai leggendo,
forse non hai mai provato a scrivere un &quot;programma&quot; per un
computer, magari perch&eacute; pensi che sia una cosa estremamente
complicata, da lasciare agli addetti ai lavori. <KBD>Python</KBD> &egrave;
un linguaggio di programmazione estremamente potente, ma anche molto
semplice. Imparare a programmare usando <KBD>Python</KBD>, pu&ograve;
essere interessante, divertente e anche alla portata di tutti.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">In questo testo
presento, alcune caratteristiche di <KBD>Python</KBD> senza per&ograve;
fare riferimento alla grafica. In questo testo parto da esempi
semplicissimi di comandi scritti nell'ambiente di sviluppo IDLE
complicando rapidamente le cose per passare alla scrittura di un
programmino e per esplorare la programmazione procedurale, funzionale
e orientata agli oggetti.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Prima di procedere
mettiamo in chiaro un aspetto critico: la licenza. Tutto il materiale
che trovate qui &egrave; frutto del mio lavoro e della mia fatica. In
particolare tutti gli errori, le imprecisioni e le sciocchezze che
potete scoprire sono di mia propriet&agrave; (intellettuale). Perci&ograve;,
prima di pensare di riutilizzare questo testo per i vostri scopi,
andate a leggervi le condizioni di licenza al <A HREF="#11. Licenza|outline"><B>capitolo
11</B></A>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Lo scopo di questo
testo &egrave; assolutamente introduttivo, non &egrave; possibile
presentare in modo esauriente il linguaggio <KBD>Python</KBD>. La
bibliografia finale, <A HREF="#12. Bibliografia|outline"><B>capitolo
12</B></A>, pu&ograve; dare qualche indicazione per continuare lo
studio di <KBD>Python</KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Buon
divertimento!</FONT></P>
<H1 CLASS="western"><A NAME="python"></A>1. Python</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">&Egrave;
un linguaggio di programmazione nato attorno al 1990. &Egrave; un
linguaggio interpretato estremamente potente e diffuso. &Egrave;
caratterizzato da una grande semplicit&agrave; sintattica e quindi
adatto anche all'uso didattico.</FONT></P>
<H1 CLASS="western"><A NAME="in-out"></A>2. Input - output</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Il
classico primo programma il &quot;Ciao mondo&quot; pu&ograve; essere
scritto cos&igrave;:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">print
&quot;Ciao mondo&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un comando <KBD>Python</KBD>
pu&ograve; essere eseguito in diversi modi noi utilizzeremo il
seguente.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Da IDLE: aprire un
terminale e dare il comando: <KBD><FONT FACE="Bitstream Vera Sans Mono">idle-python2.4</FONT></KBD>.
Si apre una finestra con alcune informazioni sulla versione di Python
e sul sistema. Sotto queste righe vengono visualizzati tre simboli di
maggiore (&quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;</FONT></KBD>&quot;)
seguiti dal cursore. A questo punto possiamo scrivere comandi di
<KBD>Python</KBD> che vengono eseguiti quando si preme il tasto
<KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;Invio&gt;</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print &quot;Ciao mondo&quot;<BR>Ciao mondo<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Possiamo
complicare le cose scrivendo un programma che:</FONT></P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">saluti,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">chieda il nome e
	lo memorizzi in una variabile,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">stampi una frase
	carina rivolta alla persona che ha scritto il nome.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Il
programma &egrave;:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print &quot;Ciao&quot;<BR>Ciao<BR>&gt;&gt;&gt; nome=raw_input(&quot;come
ti chiami? &quot;)<BR>come ti chiami? Daniele<BR>&gt;&gt;&gt; print
&quot;felice di fare la tua conoscenza, %s!&quot; % nome<BR>felice di
fare la tua conoscenza, Daniele!<BR>&gt;&gt;&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Analizziamo
il programma</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">print
&quot;Ciao&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Visualizza
una stringa nello schermo</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">nome=raw_input(&quot;come
ti chiami? &quot;)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La funzione
<KBD><FONT FACE="Bitstream Vera Sans Mono">raw_input(&lt;stringa&gt;)</FONT></KBD>
visualizza <KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;stringa&gt;</FONT></KBD>
poi attende che l'utente scriva qualcosa e quando conferma con il
tasto <KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;invio&gt;</FONT></KBD>,
inserisce nella variabile quanto scritto. La stringa pu&ograve;
contenere qualunque sequenza di caratteri, la variabile pu&ograve;
avere quasi qualunque nome ci salti in mente.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">print
&quot;felice di fare la tua conoscenza, %s!&quot; % nome</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Qui il comando <FONT FACE="Bitstream Vera Sans Mono">print</FONT>
&egrave; utilizzato in modo un po' particolare: la stringa contiene,
ad un certo punto, la sequenza di caratteri: &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">%s</FONT></KBD>&quot;
e subito dopo la stringa c'&egrave; di nuovo il carattere &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">%</FONT></KBD>&quot;
seguito dal nome di una variabile. Questa volta <KBD><FONT FACE="Bitstream Vera Sans Mono">print</FONT></KBD>,
prima di visualizzare la stringa, sostituisce, al posto di &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">%s</FONT></KBD>&quot;,
il contenuto della variabile <KBD><FONT FACE="Bitstream Vera Sans Mono">nome</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="numeri"></A>3. Numeri e operazioni</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">I calcolatori sono
famosi per i ... calcoli. Allora vediamo come se la cava <KBD>Python</KBD>:
facciamogli stampare il risultato di un'espressione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print 3*5+4*(9-5)<BR>31</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">fin qui tutto ok. Ora
proviamo a introdurre delle divisioni:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print 51/17<BR>3</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">risultato perfetto: <FONT FACE="Bitstream Vera Sans Mono"><KBD>3</KBD><FONT FACE="Helvetica, sans-serif">.
Proviamo ancora:</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print 10/4<BR>2</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Qui viene stampato <KBD><FONT FACE="Bitstream Vera Sans Mono">2</FONT></KBD>.
Ma dovrebbe essere <KBD><FONT FACE="Bitstream Vera Sans Mono">2.5</FONT></KBD>!</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il fatto &egrave; che
<KBD>Python</KBD> se ha entrambi i termini della divisione interi, d&agrave;
il risultato intero, troncato. Per avere il risultato &quot;reale&quot;,
bisogna che uno dei due numeri sia un numero &quot;reale&quot;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print 10.0/4<BR>2.5</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">e cos&igrave; viene
stampato <KBD><FONT FACE="Bitstream Vera Sans Mono">2.5</FONT></KBD>.
(si poteva anche scrivere pi&ugrave; semplicemente: <KBD><FONT FACE="Bitstream Vera Sans Mono">print
10./4</FONT></KBD>)</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il simbolo della
potenza &egrave; il doppio asterisco per avere il quadrato di <KBD>5</KBD>:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print 5**2<BR>25</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">E la radice? Pu&ograve;
sembrare strano ma <KBD>Python</KBD> non &egrave; in grado di
calcolare la radice quadrata di un numero. L'implementazione della
radice quadrata &egrave; inserita in una libreria a parte che
fornisce una serie di funzioni matematiche. La libreria si chiama
<FONT FACE="Bitstream Vera Sans Mono">math</FONT>. Per far eseguire
una radice quadrata dobbiamo prima caricare la libreria:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
import math</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">e poi:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print math.sqrt(25)<BR>5.0</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">otteniamo cos&igrave;
il valore corretto. Se volessimo calcolare la lunghezza
dell'ipotenusa di un triangolo rettangolo supponendo che i cateti
siano uno <KBD>5</KBD> e l'altro <KBD>12</KBD>:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print math.sqrt(5**2+12**2)<BR>13.0</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nelle espressioni
possiamo utilizzare anche variabili, ad esempio le lunghezze dei lati
del triangolo potrebbero essere messe in tre variabili:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
c1=5<BR>&gt;&gt;&gt; c2=12<BR>&gt;&gt;&gt;
ip=math.sqrt(c1**2+c2**2)<BR>&gt;&gt;&gt; print ip<BR>13.0</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">I simboli matematici
possono avere significati diversi a seconda del contesto, a seconda
del tipo di operandi coinvolti nelle espressioni (abbiamo gi&agrave;
visto che &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">/</FONT></KBD>&quot;
ha un funzionamento diverso se dividendo e divisore sono due numeri
interi o no).</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Potr&agrave; risultare
strano, ma &egrave; possibile sommare parole (pi&ugrave; in generale,
stringhe), o moltiplicare numeri per stringhe. Proviamo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print &quot;cinque&quot;+&quot;sette&quot;<BR>cinquesette<BR>&gt;&gt;&gt;
print &quot;cinque&quot;*3<BR>cinquecinquecinque<BR>&gt;&gt;&gt;
print (&quot;otto&quot;+&quot; &quot;)*(1+9/3)<BR>otto otto otto otto
<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<H1 CLASS="western"><A NAME="liste"></A>4. Liste</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Abbiamo visto che in
un'espressione si possono usare numeri o stringhe, ma <KBD>Python</KBD>
fornisce il supporto per altri tipi di dati, tra cui il pi&ugrave;
importante &egrave; il tipo Lista.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una lista &egrave; una
sequenza ordinata di dati, ad es.:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
a=[&quot;pane&quot;, &quot;pesce&quot;, 4, [], [&quot;acqua&quot;,
&quot;terra&quot;]]</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">I simboli che
definiscono una lista sono le parentesi quadre. Dopo il comando
precedente la variabile di nome a contiene una lista con 5 elementi:
i primi due sono delle stringhe, poi viene un numero, poi una lista
vuota e, infine, una lista che contiene due elementi. Si pu&ograve;
stampare l'intera lista con il solito comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print a<BR>['pane', 'pesce', 4, [], ['acqua', 'terra']]</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">&Egrave; possibile
attraversare tutta una lista con un semplice comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
for elemento in a: print elemento<BR>pane<BR>pesce<BR>4<BR>[]<BR>['acqua',
'terra']</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">&Egrave; anche
possibile accedere ad ogni singolo elemento della lista indicando la
sua posizione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print a[1]<BR>pesce</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Sorpresa, ho detto di
stampare l'elemento numero uno e Python mi stampa il secondo... Come
mai? Gli architetti di <KBD>Python</KBD> hanno pensato di far
iniziare tutti i conteggi da zero, quindi per visualizzare il primo
elemento della lista devo dare il comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print a[0]<BR>pane</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Tra le varie operazioni
che <KBD>Python</KBD> mi permette di fare con le liste, ho la
possibilit&agrave; di cancellare un elemento:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
del a[1]<BR>&gt;&gt;&gt; print a<BR>['pane', 4, [], ['acqua',
'terra']]</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Posso accedere ad un
elemento di una sottolista di una lista e utilizzarlo in
un'espressione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print (a[3][1]+&quot; &quot;)*3<BR>terra terra terra </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Posso modificare un
elemento, ad esempio il <KBD>4</KBD> lo sostituisco con <KBD>10</KBD>:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
a[1]=10<BR>&gt;&gt;&gt; print a<BR>['pane', 10, [], ['acqua',
'terra']]</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Posso aggiungere un
elemento in fondo ad una lista:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
a.append(&quot;pippo&quot;)<BR>&gt;&gt;&gt; print a<BR>['pane', 10,
[], ['acqua', 'terra'], 'pippo']</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Posso anche dire a
<KBD>Python</KBD> di ordinare gli elementi di una lista:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
a.sort()<BR>&gt;&gt;&gt; print a<BR>[10, [], ['acqua', 'terra'],
'pane', 'pippo']</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">L'effetto pu&ograve;
risultare piuttosto strano con una lista che contiene numeri, parole,
liste, ... Partiamo da una lista che contenga solo numeri:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
l=[123, 345, 123, 54, 65, 76, 135, 75, 90, 12,697, 52]<BR>&gt;&gt;&gt;
print l<BR>[123, 345, 123, 54, 65, 76, 135, 75, 90, 12, 697, 52]</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ora ordiniamola:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
l.sort()<BR>&gt;&gt;&gt; print l<BR>[12, 52, 54, 65, 75, 76, 90, 123,
123, 135, 345, 697]</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma se avessi voluto
l'ordine inverso? Non c'&egrave; problema:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
l.reverse()<BR>&gt;&gt;&gt; print l<BR>[697, 345, 135, 123, 123, 90,
76, 75, 65, 54, 52, 12]<BR>&gt;&gt;&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Le liste di <KBD>Python</KBD>
forniscono molti altri metodi che le rendono strumenti estremamente
utili e potenti... Nella bibliografia ci sono alcune indicazioni per
approfondire.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="funzioni"></A>5. Funzioni definite
dall'utente</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">L'ambiente IDLE
permette di scrivere dei comandi e vederne il risultato riga per
riga. Questo &egrave; interessante per capire come funziona il
linguaggio, ma di solito &egrave; comodo poter raggruppare una
sequenza di comandi, darle un nome ed eseguirli tutti assieme:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ad esempio potremmo
volere una funzione che chieda la base e l'altezza e calcoli l'area
del triangolo.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def area_triangolo():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base=input(&quot;lunghezza
della base: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;altezza=input(&quot;lunghezza
dell'altezza: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;l'area vale %s&quot; % (base*altezza/2)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Qui, per motivi
tecnici, si deve premere due volte invio, dopo aver scritto il
comando. Apparentemente non succede nulla. In realt&agrave; <KBD>Python</KBD>
ha memorizzato il blocco di istruzioni indentato (= rientrato)
rispetto al comando <FONT FACE="Bitstream Vera Sans Mono">def</FONT>
... e lo ha collegato alla parola <KBD><FONT FACE="Bitstream Vera Sans Mono">area_triangolo</FONT></KBD>.
Ora possiamo eseguire tutte queste istruzioni scrivendo il nome della
funzione seguito dalla coppia di parentesi:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
area_triangolo()<BR>lunghezza della base: 18<BR>lunghezza
dell'altezza: 7<BR>l'area vale 63<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una funzione inizia con
il comando def seguito dal nome da una coppia di parentesi, che
possono essere vuote e dai due punti. Il corpo della funzione deve
essere rientrato rispetto all'intestazione. Per eseguire una funzione
basta scrivere il suo nome seguito dalla coppia di parentesi. Una
funzione pu&ograve; chiamare un'altra funzione e, nell'intestazione,
tra le parentesi, si possono elencare delle variabili dette
parametri. Ai parametri vengono assegnati dei valori, detti
argomenti, al momento della chiamata della funzione. La funzione
precedente puo essere scomposta nelle due:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def a_tri(base, altezza):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;l'area vale %s&quot; % (base*altezza/2)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def area_triangolo():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_tri(input(&quot;lunghezza
della base: &quot;),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(&quot;lunghezza
dell'altezza: &quot;))</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
area_triangolo()<BR>lunghezza della base: 15<BR>lunghezza
dell'altezza: 4<BR>l'area vale 30<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una funzione pu&ograve;
eseguire un comando senza dare risultati, come nel caso precedente,
oppure restituire un risultato a chi l'ha chiamata. L'istruzione che
permette di restituire un risultato &egrave; <KBD><FONT FACE="Bitstream Vera Sans Mono">return</FONT></KBD>.
Possiamo riscrivere la coppia di funzioni precedenti in modo che la
prima accetti i valori di base e altezza e restituisca il valore
dell'area:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def a_tri(base, altezza):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
base*altezza/2</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def area_triangolo():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;l'area vale %s&quot; \<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%
a_tri(input(&quot;lunghezza della base:
&quot;),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(&quot;lunghezza
dell'altezza: &quot;))</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
area_triangolo()<BR>lunghezza della base: 30<BR>lunghezza
dell'altezza: 10<BR>l'area vale 150<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">In questo modo abbiamo
separato i calcoli nella funzione <KBD><FONT FACE="Bitstream Vera Sans Mono">a_tri()</FONT></KBD>
che pu&ograve; essere utilizzata all'interno di funzioni pi&ugrave;
complesse e l'imput-output nella funzione <KBD><FONT FACE="Bitstream Vera Sans Mono">area_triangolo()</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Per vedere un altro
esempio di funzione possiamo recuperare dalla memoria un altro modo
per calcolare l'area del triangolo: la formula di Erone:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def erone(l1, l2, l3):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=float(l1+l2+l3)/2
# p=semiperimetro<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import
math<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
math.sqrt(p*(p-l1)*(p-l2)*(p-l3))</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def area_triangolo_erone():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;l'area vale %s&quot; \<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%
erone(input(&quot;lunghezza del primo lato:
&quot;),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(&quot;lunghezza
del secondo lato: &quot;),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(&quot;lunghezza
del terzo lato: &quot;))</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
area_triangolo_erone()<BR>lunghezza del primo lato: 3<BR>lunghezza
del secondo lato: 4<BR>lunghezza del terzo lato: 5<BR>l'area vale
6.0<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Qui c'&egrave; una
strana istruzione: <FONT FACE="Bitstream Vera Sans Mono"><KBD>import
math</KBD><FONT FACE="Helvetica, sans-serif">.</FONT></FONT> Cosa
significa? Come abbiamo visto, <KBD>Python</KBD> non ha un'istruzione
per calcolare la radice quadrata, ma questo ed altri calcoli sono
riuniti in una libreria matematica. Quindi, prima di eseguire un
calcolo presente nella libreria matematica bisogna caricarla con
l'istruzione: <KBD><FONT FACE="Bitstream Vera Sans Mono">import math</FONT></KBD>.
Ci sono moltissime librerie che estendono le capacit&agrave; del
linguaggio. Per caricare le funzioni presenti in una libreria bisogna
usare il comando <KBD><FONT FACE="Bitstream Vera Sans Mono">import</FONT></KBD>
seguito dal nome della libreria stessa.</P>
<H1 CLASS="western"><A NAME="scelte"></A>6. Scelte</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Altro elemento
fondamentale dei linguaggi di programmazione &egrave; il controllo
del flusso del programma. Di solito le istruzioni vengono eseguite in
ordine una di seguito all'altra dalla prima all'ultima, ma ci sono
delle istruzioni che permettono di eseguire un blocco di istruzioni
al posto di un altro. L'istruzione di selezione presente in <KBD>Python</KBD>
&egrave;: <KBD><FONT FACE="Bitstream Vera Sans Mono">if</FONT></KBD>.
Una funzione che riconosce se un numero &egrave; pari pu&ograve;
essere scritta cos&igrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def pari(n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if n
% 2 == 0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s &egrave; pari&quot; % n</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
pari(4654)<BR>4654 &egrave; pari<BR>&gt;&gt;&gt; pari(2347423)<BR>&gt;&gt;&gt;
</FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Osservazione, come nel
linguaggio naturale la stessa paroa pu&ograve; avere significati
molto diversi, cos&igrave; nei linguaggi formali lo stesso simbolo a
volte ha significati diversi in diversi contesti. Nella funzione
<KBD>pari(n)</KBD> uno stesso simbolo &egrave; scritto 3 volte con 3
significati diversi:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Bitstream Vera Sans Mono"><FONT COLOR="#808000">n
% 2</FONT></FONT> in questo caso &ldquo;<KBD>%</KBD>&rdquo; indica
l'operazione di resto di una divisione, 
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Bitstream Vera Sans Mono"><FONT COLOR="#808000">%s</FONT></FONT>
indica il segnaposto per un dato che verr&agrave; convertito in
stringa e inserito in quel punto.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Bitstream Vera Sans Mono"><FONT COLOR="#808000">%
n</FONT></FONT> il dato che verr&agrave; inserito nella stringa
precedente.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La sintassi di questa
istruzione &egrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">if
&lt;condizione&gt;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;blocco di
istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La funzione pari
riconosce i numeri pari, scrivendolo, ma non fa niente nel caso
contrario. L'istruzione <FONT FACE="Bitstream Vera Sans Mono">if</FONT>
pu&ograve; essere completato in questo modo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">if
&lt;condizione&gt;:</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: always">
<FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">&lt;blocco
di istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium; page-break-before: always">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">else:</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: always">
<FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">&lt;blocco
istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: always">
<BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La funzione precedente
quindi diventa:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def pari(n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if n
% 2 == 0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s &egrave; pari&quot; % n<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s &egrave; dispari&quot; % n</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
pari(234652)<BR>234652 &egrave; pari<BR>&gt;&gt;&gt;
pari(9456421)<BR>9456421 &egrave; dispari</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una funzione che
restituisce il maggiore tra due numeri pu&ograve; essere scritta
cos&igrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def maggiore(a, b):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
a&gt;b:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
a<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
b</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print maggiore(2346, 23465)<BR>23465</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">E se invece di due
numeri dobbiamo trovare il maggiore tra 3 numeri, la funzione si
complica:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def maggiore3(a, b, c):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
a&gt;b:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
a&gt;c:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
a<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
c<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
b&gt;c:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
b<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
c</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print maggiore3(34, 67, 12)<BR>67<BR>&gt;&gt;&gt; print maggiore3(34,
25, 12)<BR>34<BR>&gt;&gt;&gt; print maggiore3(34, 25, 126)<BR>126<BR>&gt;&gt;&gt;
print maggiore3(34, 34, 34)<BR>34</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come si vede le
istruzioni <KBD><FONT FACE="Bitstream Vera Sans Mono">if</FONT></KBD>
possono essere annidate una dentro l'altra.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un altro esempio di
funzione che utilizza la selezione &egrave; una funzione che
restituisce vero o falso (<KBD>True</KBD> o <KBD>False</KBD>) se il
primo di tre numeri &egrave; compreso tra gli altri due:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def tra(n, mi, ma):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
mi&lt;n and n&lt;ma:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
True<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print tra(45, 29, 50)<BR>True<BR>&gt;&gt;&gt; print tra(5, 29,
50)<BR>False<BR>&gt;&gt;&gt; print tra(59, 29, 50)<BR>False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questa prima versione
funziona, ma <KBD>Python</KBD> mette a disposizione una sintassi che
rende la condizione pi&ugrave; semplice da scrivere e pi&ugrave;
leggibile:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def tra(n, mi, ma):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
mi&lt;n&lt;ma:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
True<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print tra(45, 29, 50)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">True<BR>&gt;&gt;&gt;
print tra(5, 29, 50)<BR>False<BR>&gt;&gt;&gt; print tra(59, 29,
50)<BR>False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Si pu&ograve; essere
ancora pi&ugrave; sintetici, ma a questo punto l'istruzione <KBD><FONT FACE="Bitstream Vera Sans Mono">if</FONT></KBD>
non centra pi&ugrave;... 
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def tra(n, mi, ma):<BR>return mi&lt;n&lt;ma</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print tra(45, 29, 50)<BR>True<BR>&gt;&gt;&gt; print tra(5, 29,
50)<BR>False<BR>&gt;&gt;&gt; print tra(59, 29, 50)<BR>False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">...e la sintassi di
<KBD>Python</KBD> permette di fare a meno della funzione precedente:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print 45&lt;29&lt;50<BR>True<BR>&gt;&gt;&gt; print 5&lt;29&lt;50<BR>False<BR>&gt;&gt;&gt;
print 59&lt;29&lt;50<BR>False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">A volte la scelta non &egrave;
tra due opzioni, ma tra pi&ugrave; opzioni <KBD>Python</KBD> mette a
disposizione il costrutto:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">if
&lt;condizione&gt;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;blocco di
istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">elif
&lt;condizione&gt;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;blocco di
istruzioni&gt;<BR>...<BR>else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;blocco
istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questa istruzione pu&ograve;
essere usata ad esempio all'interno delle scelte di un menu:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def menu():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;<BR>a) prima opzione<BR>b) seconda opzione<BR>c)
terza opzione<BR>f) per finire<BR>&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;risposta=raw_input(&quot;premi
un tasto e &lt;invio&gt; &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
risposta==&quot;a&quot;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&egrave; stata scelta la prima opzione&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
risposta==&quot;b&quot;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&egrave; stata scelta la seconda opzione&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
risposta==&quot;c&quot;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&egrave; stata scelta la terza opzione&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
risposta==&quot;f&quot;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Si vuole finire&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&egrave; stata premuto un tasto non previsto&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
menu()<BR>a) prima opzione<BR>b) seconda opzione<BR>c) terza
opzione<BR>f) per finire</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">premi
un tasto e &lt;invio&gt; f<BR>Si vuole finire<BR>&gt;&gt;&gt;
menu()<BR>a) prima opzione<BR>b) seconda opzione<BR>c) terza
opzione<BR>f) per finire</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">premi
un tasto e &lt;invio&gt; b<BR>&egrave; stata scelta la seconda
opzione<BR>&gt;&gt;&gt; menu()<BR>a) prima opzione<BR>b) seconda
opzione<BR>c) terza opzione<BR>f) per finire</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">premi
un tasto e &lt;invio&gt; w<BR>&egrave; stata premuto un tasto non
previsto<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<H1 CLASS="western"><A NAME="cicli"></A>7. Cicli e errori di
programmazione</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Altro elemento
fondamentale del controllo del flusso del programma &egrave;
l'iterazione. Questa permette di ripetere pi&ugrave; volte un blocco
di istruzioni.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ad esempio se voglio
stampare 5 volte una parola posso dare il comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
for i in range(5): print &quot;Ciao&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">Ciao<BR>Ciao<BR>Ciao<BR>Ciao<BR>Ciao<BR>&gt;&gt;&gt;
</FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Usando variabili lo
stesso comando pu&ograve; essere dato in quest'altro modo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
numero=5<BR>&gt;&gt;&gt; parola=&quot;Ciao&quot;<BR>&gt;&gt;&gt; for
i in range(numero):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
parola</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">Ciao<BR>Ciao<BR>Ciao<BR>Ciao<BR>Ciao<BR>&gt;&gt;&gt;
</FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La riga: <FONT FACE="Bitstream Vera Sans Mono"><KBD>for
i in range(numero)</KBD>:</FONT> &egrave; l'intestazione del ciclo,
<KBD><FONT FACE="Bitstream Vera Sans Mono">print parola</FONT></KBD>
&egrave; il blocco di codice che viene ripetuto. Il blocco di codice
pu&ograve; essere costituito da pi&ugrave; righe e pu&ograve;
contenere il riferimento alla variabile indicata nell'intestazione
del ciclo. ad esempio se volessi un elenco dei primi dieci numeri
naturali, dei loro quadrati e dei loro cubi, potrei scrivere il
seguente comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
for i in range(10):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
i,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;\t&quot;,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
i**2,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;\t&quot;,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
i**3</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0<BR>1&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;1<BR>2&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;8<BR>3&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;27<BR>4&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;64<BR>5&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp;125<BR>6&nbsp;&nbsp;&nbsp;36&nbsp;&nbsp;216<BR>7&nbsp;&nbsp;&nbsp;49&nbsp;&nbsp;343<BR>8&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;512<BR>9&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp;729<BR>&gt;&gt;&gt;
</FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Da osservare che la
virgola posta alla fine del comando <KBD><FONT FACE="Bitstream Vera Sans Mono">print</FONT></KBD>
fa in modo che il comando <FONT FACE="Bitstream Vera Sans Mono">print</FONT>
seguente produca la visualizzazione sulla stessa riga.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il ciclo <KBD><FONT FACE="Bitstream Vera Sans Mono">for</FONT></KBD>
&egrave; adatto in tutti i casi in cui si conosce preventivamente il
numero di iterazioni. A volte questa informazione non l'abbiamo prima
di iniziare il ciclo, ma solo durante lo svolgimento del ciclo
stesso. In questi casi &egrave; d'obbligo usare un ciclo <KBD><FONT FACE="Bitstream Vera Sans Mono">while</FONT></KBD>.
Ad esempio supponiamo di voler calcolare la media di un gruppo di
numeri positivi, vogliamo che il programma continui a elaborare i
numeri finch&eacute; non introduciamo il numero 0.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def
medianumeri():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero=input(&quot;scrivi
un numero: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while
numero&lt;&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma+=numero<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;media=float(somma)/numeri<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;La media di questi %s numeri &egrave;: %s&quot; %(numeri,
media)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">&Egrave; un classico
esercizio di introduzione alla programmazione. Vengono inizializzate
a zero due variabili, una che conterr&agrave; la somma dei numeri
immessi, l'altra per tenere conto di quanti numeri vengono immessi.
Si legge il primo numero e si avvia il ciclo che, finch&eacute; il
numero inserito &egrave; diverso da zero, lo aggiunge alla somma e
incrementa la variabile numeri. Proviamolo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
medianumeri<BR>&lt;function medianumeri at 0x40357454&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questo succede spesso,
soprattutto all'inizio. Ho dimenticato le parentesi:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
medianumeri()<BR>scrivi un numero: 45</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Altro problema: immesso
il primo numero non ne chiede altri e il programma continua a
girare... Intanto blocchiamo l'esecuzione con il tasto <KBD>&lt;Ctrl
&ndash; c&gt;</KBD> (tenendo premuto il tasto &ldquo;Ctrl&rdquo;
premere il tasto &ldquo;c&rdquo; minuscolo).</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">Traceback
(most recent call last):<BR>File &quot;&lt;pyshell#13&gt;&quot;, line
1, in -toplevel-<BR>medianumeri()<BR>File &quot;&lt;pyshell#11&gt;&quot;,
line 7, in medianumeri<BR>numeri+=1<BR>KeyboardInterrupt</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Si &egrave; interrotto
il ciclo infinito che avevamo avviato.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Poi riguardiamo il
codice: la funzione input &egrave; esterna al ciclo quindi viene
eseguita una sola volta. Dobbiamo scriverne una analoga anche
all'interno del ciclo, alla fine.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def medianumeri():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Calcolo della media di una sequenza di numeri&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;immettere il numero 0 per
terminare&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero=input(&quot;scrivi
un numero: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while
numero&lt;&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma+=numero<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero=input(&quot;scrivi
un altro numero: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;media=float(somma)/numeri<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;La media di questi %s numeri &egrave;: %s&quot; %(numeri,
media)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
medianumeri()<BR>Calcolo della media di una sequenza di
numeri<BR>immettere il numero 0 per terminare<BR>scrivi un numero: 0</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come primo numero
scrivo <KBD>0</KBD>. Non &egrave; molto intelligente scrivere tutto
un programma per calcolare la media di zero numeri, ma le condizioni
estreme vanno sempre verificate. Il risultato &egrave; ancora un
errore.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">Traceback
(most recent call last):<BR>File &quot;&lt;pyshell#17&gt;&quot;, line
1, in -toplevel-<BR>medianumeri()<BR>File &quot;&lt;pyshell#15&gt;&quot;,
line 11, in medianumeri<BR>media=float(somma)/numeri<BR>ZeroDivisionError:
float division</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Infatti il programma si
interrompe con un errore dovuto al tentativo di fargli eseguire una
divisione per zero. Dobbiamo mettere un controllo prima di cercare di
eseguire la divisione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def medianumeri():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Calcolo della media di una sequenza di numeri&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;immettere il numero 0 per
terminare&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero=input(&quot;scrivi
un numero: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while
numero&lt;&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma+=numero<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero=input(&quot;scrivi
un altro numero: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
numeri&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;media=float(somma)/numeri<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;La media di questi %s numeri &egrave;: %s&quot; % \</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">(numeri,
media)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Nessun numero immesso&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
medianumeri()<BR>Calcolo della media di una sequenza di
numeri<BR>immettere il numero 0 per terminare<BR>scrivi un numero:
0<BR>Nessun numero immesso</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
medianumeri()<BR>Calcolo della media di una sequenza di
numeri<BR>immettere il numero 0 per terminare<BR>scrivi un numero:
45<BR>scrivi un altro numero: 67<BR>scrivi un altro numero: 23<BR>scrivi
un altro numero: 84<BR>scrivi un altro numero: 39<BR>scrivi un altro
numero: 0<BR>La media di questi 5 numeri &egrave;: 51.6</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questa volta le varie
prove danno esito positivo.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">In certi casi
l'istruzione di <KBD>input</KBD> ripetuta due volte pu&ograve; dare
fastidio. Un altro modo tipico per realizzare un ciclo di input e
elaborazione &egrave; il seguente:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
def medianumeri():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Calcolo della media di una sequenza di numeri&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;immettere il numero 0 per
terminare&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while
True:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero=input(&quot;scrivi
un numero: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
numero==0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;somma+=numero<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeri+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
numeri&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;media=float(somma)/numeri<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;La media di questi %s numeri &egrave;: %s&quot; % \</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">(numeri,
media)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Nessun numero immesso&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Quest'altro meccanismo
funziona cos&igrave;:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Viene avviato un
	ciclo infinito: while True:</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Viene letto il
	numero,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Viene effettuato
	un controllo sul numero,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">se il numero &egrave;
	zero si esce dal ciclo,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">altrimenti si
	eseguono le elaborazioni.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
medianumeri()<BR>Calcolo della media di una sequenza di numeri
positivi<BR>immettere il numero 0 per terminare<BR>scrivi un numero:
99<BR>scrivi un numero: 1<BR>scrivi un numero: 45<BR>scrivi un
numero: 55<BR>scrivi un numero: 50<BR>scrivi un numero: 0<BR>ma media
di questi 5 numeri &egrave;: 50.0<BR>&gt;&gt;&gt; </FONT></FONT>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Qualche prova ci
assicura che anche questo algoritmo funziona a dovere.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="procedurale"></A>8. Programmazione
procedurale</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">I programmi servono per
risolvere dei problemi attraverso il linguaggio. Le caratteristiche
del linguaggio usato sono solo in parte neutre, lo stesso problema
pu&ograve; essere risolto con linguaggi diversi. Molto spesso gli
strumenti culturali che possediamo influenzano il modo di risolvere
problemi e anche il tipo di problemi che affrontiamo. Nei pochi anni
di vita dei linguaggi di programmazione c'&egrave; stata
un'evoluzione che ha portato dal modello di Von Newmann, alla
programmazione funzionale, alla programmazione strutturata, alla
programmazione logica alla programmazione orientata agli oggetti.
Ogni nuovo paradigma di programmazione ha ampliato quelli precedenti
senza per&ograve; soppiantarli. <KBD>Python</KBD> permette di
utilizzare diversi paradigmi:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">strutturato,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">funzionale,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">ad oggetti.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">In questi tre capitoli
affrontiamo uno stesso tema utilizzando diversi paradigmi di
programmazione. A differenza degli esempi precedenti, nei prossimi
utilizzeremo <KBD>IDLE</KBD> di <KBD>Python</KBD> solo per lanciare i
programmi, mentre il programma stesso viene scritto in un file di
testo. Da <KBD>IDLE</KBD>, il menu <KBD>File-New Window</KBD>,
permette di aprire una finestra di editor per scrivere il programma.
Poi, attraverso il menu <KBD>File-Save</KBD>, salviamo il file con il
nome <KBD>frazioni01.py</KBD>. Il nome pu&ograve; essere dato a
fantasia, ma l'estensione, &quot;<KBD>.py</KBD>&quot; &egrave;
importante: indica che il file contiene un programma in linguaggio
<KBD>Python</KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Quando incominciamo a
scrivere programmi, dobbiamo preoccuparci di commentarli per bene.
Perch&eacute; anche programmi semplici, dopo poco tempo, diventano
incomprensibili all'autore stesso. In <KBD>Python</KBD> ci sono due
(tre) modi per inserire dei commenti:</P>
<OL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">il carattere &quot;<KBD>#</KBD>&quot;
	indica che la riga seguente &egrave; un commento, non va
	interpretata.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">tre virgolette
	doppie, o tre virgolette semplici, di seguito aprono e chiudono un
	commento che pu&ograve; estendersi su pi&ugrave; righe.</P>
</OL>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il primo programmino
che presento permette di esercitarsi nel calcolo con le frazioni.
Scelto il tipo di operazioni su cui si vuole lavorare da un menu
iniziale, il programma propone un certo numero di operazioni
controllando la risposta data. La prima impostazione del programma:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">#!/usr/bin/env
python<BR># -*- coding: iso-8859-15
-*-<BR>#----------------------------python---------------frazioni01.py--#<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Esercitatore
di calcolo con le
Frazioni&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<BR>#--Daniele
Zambelli----------------------------------------2005--#</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
eser_fraz():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;
Esercitatore di calcolo frazionario.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Presenta
un menu e offre la possibilit&agrave; di esercitarsi
su<BR>&nbsp;&nbsp;&nbsp;&nbsp;addizioni, sottrazioni, moltiplicazioni
o divisioni<BR>&nbsp;&nbsp;&nbsp;&nbsp;con le frazioni.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">while
True:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scelta=raw_input(&quot;La
tua scelta: &quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
scelta==&quot;0&quot;: break<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;1&quot;: addizione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;2&quot;: sottrazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;3&quot;: moltiplicazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;4&quot;: divisione()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
menu():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Menu di scelta
degli esercizi.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;<BR>Frazioni<BR><BR>Scegli il tipo di esercizi:<BR>1:
Addizione<BR>2: Sottrazione<BR>3: Moltiplicazione<BR>4: Divisione</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">0:
Fine<BR>&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
addizione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sull'addizione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le addizioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sottrazione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla sottrazione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le sottrazioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
moltiplicazione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla moltiplicazione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le moltiplicazioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
divisione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla divisione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le divisioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Osservazioni 
</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Il commento iniziale &egrave; bene che contenga informazioni
	sull'autore, la data il linguaggio, il programma, ...</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Ogni procedura dovrebbe avere una linea di documentazione
	immediatamente dopo l'intestazione, pi&ugrave; tutti gli altri
	commenti che si pensa possano essere utili.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Le triple virgolette, oltre a delimitare commenti estesi, si
	utilizzano in <KBD>Python</KBD> anche per delimitare stringhe su pi&ugrave;
	righe.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">La procedura
	<KBD><FONT FACE="Bitstream Vera Sans Mono">eser_fraz()</FONT></KBD>
	&egrave; la procedura principale: visualizza il menu, attende la
	scelta dell'utente e avvia la procedura richiesta che contiene gli
	esercizi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">A parte la
	procedura <KBD>menu()</KBD>, le altre sono ancora praticamente
	vuote.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Prima di procedere
	con la scrittura del programma conviene controllare che fin qui
	tutto funzioni: Tasto <KBD>&lt;F5&gt;</KBD> ( o menu <KBD>Run-Run
	Module</KBD>), poi nella finestra di <KBD>IDLE</KBD> chiamiamo la
	procedura <KBD><FONT FACE="Bitstream Vera Sans Mono">eser_fraz()</FONT></KBD>.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se tutto funziona
possiamo procedure con la programmazione.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Dobbiamo far funzionare
le procedure <KBD>addizione</KBD>, <KBD>sottrazione</KBD>, ...
Partiamo con <KBD>addizione</KBD>, le altre le lascio come esercizio.
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Addizione:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">per un certo
	numero di volte:</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	deve inventare un esercizio,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">proporlo,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	leggere la risposta dell'utente,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">confrontare la
	risposta con la soluzione esatta e,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	se la risposta &egrave; giusta, complimentarsi,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">se &egrave;
	sbagliata, segnalarlo e indicare quale era la risposta corretta.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">import
random</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">NUM_ESERCIZI=3<BR>MAX_VAL=11</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
eser_fraz():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;
Esercitatore di calcolo frazionario.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
True:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
Stampa il menu<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scelta=raw_input(&quot;La
tua scelta: &quot;) # legge scelta utente<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
scelta==&quot;0&quot;: break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
0 termina il ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;1&quot;: addizione()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
le varie scelte...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;2&quot;: sottrazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;3&quot;: moltiplicazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;4&quot;: divisione()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
menu():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Menu di scelta
degli esercizi.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;<BR>Frazioni<BR><BR>Scegli il tipo di esercizi:<BR>1:
Addizione<BR>2: Sottrazione<BR>3: Moltiplicazione<BR>4: Divisione<BR><BR>0:
Fine<BR>&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
addizione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sull'addizione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for
i in xrange(NUM_ESERCIZI): # ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;num1=random.randrange(1,
MAX_VAL) # scelta casuale dei<BR>&nbsp;&nbsp;&nbsp;&nbsp;den1=random.randrange(1,
MAX_VAL) # valori<BR>&nbsp;&nbsp;&nbsp;&nbsp;num2=random.randrange(1,
MAX_VAL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;den2=random.randrange(1,
MAX_VAL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;numr=num1*den2+num2*den1 # num.
del risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;denr=den1*den2 # den. del
risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;divisore=2 # semplificazione
della frazione<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
divisore&lt;=denr/2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
numr % divisore == 0 and denr % divisore ==
0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numr/=divisore<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;denr/=divisore<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;divisore+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;risposta=raw_input(&quot;%s/%s+%s/%s
= &quot; % (num1,den1,num2,den2))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
risposta == &quot;%s/%s&quot; % (numr,
denr):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giusto()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliato(numr,
denr)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sottrazione():</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;&ldquo;<FONT FACE="Bitstream Vera Sans Mono">&quot;&quot;Esercizi
sulla sottrazione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le sottrazioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
moltiplicazione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla moltiplicazione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le moltiplicazioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
divisione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla divisione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le divisioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
giusto():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni da
svolgare quando la risposta &egrave; giusta.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Bravo, la risposta &egrave; giusta!&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sbagliato(num, den):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni
da svolgare quando la risposta &egrave; sbagliata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Sbagliato, la risposta era: %s/%s&quot; % (num,
den)<BR>&nbsp;&nbsp;&nbsp;&nbsp;c=raw_input(&quot;premi &lt;invio&gt;&quot;)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Osservazioni</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Per inventare
	esercizi, abbiamo bisogno di un generatore di numeri casuali che si
	trova nella libreria random, quindi dobbiamo leggerla. Io preferisco
	ragruppare tutte le librerie necessarie all'inizio del programma, ma
	&egrave; questione di gusti.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	<FONT FACE="Bitstream Vera Sans Mono">NUM_ESERCIZI=3</FONT> e
	<FONT FACE="Bitstream Vera Sans Mono">MAX_VAL=11</FONT> sono due
	variabili (che svolgono il ruolo di costanti) che indicano quanti
	esercizi di ogni tipo vanno somministrati (io per non stressarmi
	nelle prove ne ho messi solo 3) e il valore massimo di numeratore e
	denominatore.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Bitstream Vera Sans Mono">addizione</FONT>
	ripete per <FONT FACE="Bitstream Vera Sans Mono">NUM_ESERCIZI</FONT>
	volte l'assegnazione di un esercizio.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	La procedura <FONT FACE="Bitstream Vera Sans Mono">eser_fraz()</FONT>
	&egrave; la procedura principale: visualizza il menu, attende la
	scelta dell'utente e avvia la procedura con gli esercizi richiesta.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Per ogni esercizio
	vengono presi 4 numeri a caso che costituiscono numeratore e
	denominatore dei due addendi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Poi vengono calcolati numeratore e denominatore del risultato.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">A questo punto si
	avvia un ciclo per ridurre la frazione ai minimi termini.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Finalmente viene posta la domanda e confrontata la risposta con il
	risultato calcolato precedentemente.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Se la risposta &egrave;
	corretta viene chiamata la procedura giusto() altrimenti la
	procedura sbagliato(num, den) passandole, in questo caso i valori
	corretti da comunicare all'alunno.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Come prima, dopo aver modificato il programma e corretto gli errori
	di sintassi, si premiamo il tasto &lt;F5&gt; , poi nella finestra di
	IDLE chiamiamo la procedura <FONT FACE="Bitstream Vera Sans Mono">eser_fraz()</FONT>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Una volta tolti
	tutti gli errori, dovrebbe fare quello che ci eravamo proposti.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Un
ultimo tocco: un po' di valutazione.</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Per
poter seguire con precisione i nostri progressi nel calcolo
frazionario mentale facciamo in modo che il programma tenga conto di
quanti esercizi giusti e quanti sbagliati abbiamo fatto.</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Dobbiamo modificare la
procedura addizioni aggiungendo due variabili: <KBD><FONT FACE="Bitstream Vera Sans Mono">giuste</FONT></KBD>,
<KBD><FONT FACE="Bitstream Vera Sans Mono">sbagliate</FONT></KBD> e
aggiungere una procedura che visualizzi le statistiche. Il programma
diventa:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">import
random</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">NUM_ESERCIZI=3<BR>MAX_VAL=11</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
eser_fraz():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;
Esercitatore di calcolo frazionario.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
True:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
Stampa il menu<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scelta=raw_input(&quot;La
tua scelta: &quot;) # legge scelta utente<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
scelta==&quot;0&quot;: break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
0 termina il ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;1&quot;: addizione()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
le varie scelte...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;2&quot;: sottrazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;3&quot;: moltiplicazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;4&quot;: divisione()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
menu():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Menu di scelta
degli esercizi.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;<BR>Frazioni<BR><BR>Scegli il tipo di esercizi:<BR>1:
Addizione<BR>2: Sottrazione<BR>3: Moltiplicazione<BR>4: Divisione<BR><BR>0:
Fine<BR>&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
addizione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sull'addizione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;giuste=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;sbagliate=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;for
i in xrange(NUM_ESERCIZI):&nbsp;&nbsp;&nbsp;&nbsp;#
ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;num1=random.randrange(1, MAX_VAL)&nbsp;#
scelta casuale dei<BR>&nbsp;&nbsp;&nbsp;&nbsp;den1=random.randrange(1,
MAX_VAL)&nbsp;# valori<BR>&nbsp;&nbsp;&nbsp;&nbsp;num2=random.randrange(1,
MAX_VAL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;den2=random.randrange(1,
MAX_VAL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;numr=num1*den2+num2*den1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
num. del risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;denr=den1*den2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
den. del risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;divisore=2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
sempl. della frazione<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
divisore&lt;=denr/2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
numr % divisore == 0 and denr % divisore ==
0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numr/=divisore<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;denr/=divisore<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;divisore+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;risposta=raw_input(&quot;%s/%s+%s/%s
= &quot; % (num1,den1,num2,den2))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
risposta == &quot;%s/%s&quot; % (numr,
denr):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giusto()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giuste+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliato(numr,
denr)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliate+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;risultati(&quot;addizioni&quot;,
giuste, sbagliate)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sottrazione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla sottrazione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le sottrazioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
moltiplicazione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla moltiplicazione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le moltiplicazioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
divisione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla divisione di frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;ecco le divisioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
giusto():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni da
svolgare quando la risposta &egrave; giusta.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Bravo, la risposta &egrave; giusta!&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sbagliato(num, den):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni
da svolgare quando la risposta &egrave; sbagliata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Sbagliato, la risposta era: %s/%s&quot; % (num,
den)<BR>&nbsp;&nbsp;&nbsp;&nbsp;c=raw_input(&quot;premi &lt;invio&gt;&quot;)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
risultati(tipo, g, s):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Visualizza
i risultati ottenuti.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;\n\nNelle %s, hai ottenuto %s%% di risposte esatte!\n&quot;
\<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%
(tipo, 100*g/(g+s))<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=raw_input(&quot;premi
&lt;invio&gt; per continuare&quot;)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Le due modifiche sono
abbastanza ovvie. Perch&eacute; sia pi&ugrave; significativo il
programma dovrebbe tener conto anche dei tempi di risposta, ma in
questo modo le cose si complicano un poco. Questo pu&ograve; essere
un buon esercizio da fare dopo aver completato le altre tre
operazioni.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="funzionale"></A>9. Programmazione
funzionale</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nel programma
precedente l'esercizio consiste nell'utilizzare il programma stesso,
ora invece l'esercizio &egrave; scrivere il programma. Ci poniamo
l'obiettivo di scrivere delle funzioni <KBD>Python</KBD> che siano in
grado di eseguire le operazioni con le frazioni. Il calcolo con le
frazioni &egrave; un argomento, affrontato all'inizio della scuola
media, piuttosto noioso... un ottimo motivo per far fare i calcoli a
qualcun altro.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Noi siamo abituati a
vedere le frazioni come due numeri separati da una linea. Ma la linea
di frazione possiamo sottintenderla e quindi una frazione per noi
sar&agrave; semplicemente una coppia ordinata di numeri: tre quarti =
(3, 4).</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Avremo bisogno di una
funzione che costruisce la coppia, di una che ne estrae il numeratore
di una che estrae il denominatore e di altre che date due frazioni ne
eseguano le solite operazioni.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma prima di tutto serve
una funzione che dati due numeri ne calcoli il massimo divisore
comune la si pu&ograve; realizzare utilizzando l'algoritmo di Euclide
o qualche altro algoritmo.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
mcd(a, b):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Massimo
Comune Divisore tra a e b&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;a=abs(a);
b=abs(b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;while a&lt;&gt;b and a&lt;&gt;1
and b&lt;&gt;1:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
a&gt;b: a-=b<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
b-=a<BR>&nbsp;&nbsp;&nbsp;&nbsp;if b==1:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
b<BR>&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
a</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La funzione ha due
parametri (che ho chiamato <KBD><FONT FACE="Bitstream Vera Sans Mono">a</FONT></KBD>
e <KBD><FONT FACE="Bitstream Vera Sans Mono">b</FONT></KBD>).
L'istruzione fondamentale nelle funzioni &egrave; l'istruzione
<FONT FACE="Bitstream Vera Sans Mono">return</FONT>. Questa
istruzione pu&ograve; essere seguita da un oggetto, fa terminare la
funzione e restituisce l'oggetto a chi l'ha chiamata. Nella funzione
<KBD><FONT FACE="Bitstream Vera Sans Mono">mcd(a, b)</FONT></KBD>,
alla fine del ciclo, la variabile <KBD><FONT FACE="Bitstream Vera Sans Mono">a</FONT></KBD>
o la variabile <KBD><FONT FACE="Bitstream Vera Sans Mono">b</FONT></KBD>
contengono il massimo comune divisore dei due numeri di partenza. A
questo punto il comando <KBD><FONT FACE="Bitstream Vera Sans Mono">return
a</FONT></KBD> o <KBD><FONT FACE="Bitstream Vera Sans Mono">return b</FONT></KBD>
restituiscono il risultato cercato a chi ha chiamato la funzione.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">A questo punto
costruiamo una funzione che, dati due numeri, restituisca la coppia
che rappresenta la frazione. Il modo pi&ugrave; semplice &egrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
frazione(num, den):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una frazione dati numeratore e denominatore.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">return
(num, den)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma costruire una
frazione come si deve richiede un po' pi&ugrave; di lavoro. Intanto
dobbiamo controllare che il denominatore sia diverso da zero. Poi
vogliamo che la frazione sia la pi&ugrave; semplice possibile,
infine, il denominatore deve essere positivo.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
frazione(num, den):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una frazione dati numeratore e denominatore.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Solleva
un'eccezione se il denominatore &egrave; nullo.<BR>&nbsp;&nbsp;&nbsp;&nbsp;Il
denominatore &egrave; sempre positivo.<BR>&nbsp;&nbsp;&nbsp;&nbsp;La
frazione &egrave; ridotta ai minimi termini.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if
den==0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise
ZeroDivisionError<BR>&nbsp;&nbsp;&nbsp;&nbsp;elif
num==0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (0,
1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
den&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
riduci((num, den))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
riduci((-num, -den))</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ci serve dunque una
funzione che restituisce una coppia di numeri &quot;ridotti&quot; ai
minimi termini, cio&egrave; divisi per il loro MCD:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
riduci(f):</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">&quot;&quot;&quot;Riduce
una coppia di numeri dividendoli per il loro MCD.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;num,
den = f</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">divisore=mcd(num,
den)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">return
(num/divisore, den/divisore)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">A questo punto possiamo
dedicarci all'addizione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sommaf(f1, f2):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
la somma di due frazioni.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">num1,
den1 = f1<BR>&nbsp;&nbsp;&nbsp;&nbsp;num2, den2 = f2<BR>&nbsp;&nbsp;&nbsp;&nbsp;num
= num1*den2+num2*den1<BR>&nbsp;&nbsp;&nbsp;&nbsp;den =
den1*den2<BR>&nbsp;&nbsp;&nbsp;&nbsp;return frazione(num, den)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">&Egrave; interessante
la possibilit&agrave; che d&agrave; Python dell'assegnazione
multipla. L'istruzione: <KBD><FONT FACE="Bitstream Vera Sans Mono">num1,
den1 = f1</FONT></KBD> assegna a <KBD><FONT FACE="Bitstream Vera Sans Mono">num1</FONT></KBD>
il primo elemento della coppia <KBD><FONT FACE="Bitstream Vera Sans Mono">f1</FONT></KBD>
e a <KBD><FONT FACE="Bitstream Vera Sans Mono">den1</FONT></KBD> il
secondo elemento. A scuola, per lavorare con numeri pi&ugrave;
piccoli, si cerca il minimo comune denominatore, qui i calcoli li fa
il computer, non importa che i numeri siano piccoli. Prendiamo come
denominatore comune il prodotto dei due denominatori e poi riduciamo
il risultato ai minimi termini.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Man mano che scriviamo
delle funzioni ci conviene provarle per controllare che siano
corrette. Possiamo farlo in due modi:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	eseguire il programma (<KBD>Run &ndash; Run module</KBD> oppure
	<KBD>&lt;F5&gt;</KBD>) e poi dalla Shell di IDLE provare i comandi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Scrivere una procedura di test che venga eseguita quando si esegue
	il programma (come descrivo pi&ugrave; avanti).</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">A questo punto l'unico
limite &egrave; la fantasia e in modo facile possiamo implementare
tutte le altre operazioni che ci vengano in mente:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
oppostof(f):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
l'opposto di una frazione.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;num,
den = f<BR>&nbsp;&nbsp;&nbsp;&nbsp;return frazione(-num, den)<BR><BR>def
differenzaf(f1, f2):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
la differenza di due frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return
sommaf(oppostof(f1), f2)<BR><BR>def prodottof(f1,
f2):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce il
prodotto di due frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;num1,
den1 = f1<BR>&nbsp;&nbsp;&nbsp;&nbsp;num2, den2 = f2<BR>&nbsp;&nbsp;&nbsp;&nbsp;return
frazione(num1*num2, den1*den2)<BR><BR>def
reciprocof(f):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il reciproco di una frazione.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;num,
den = f<BR>&nbsp;&nbsp;&nbsp;&nbsp;return frazione(den, num)<BR><BR>def
quozientef(f1, f2):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il quoziente di due frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return
prodottof(f1, reciprocof(f2))<BR><BR>def randf(num_mi, num_ma,
den_mi, den_ma):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una frazione casuale.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Il numeratore &egrave;
compreso tra num_mi e num_ma;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Il
denominatore &egrave; compreso tra den_mi e den_ma&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;from
random import randrange<BR>&nbsp;&nbsp;&nbsp;&nbsp;num=randrange(num_mi,
num_ma)<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
True:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;den=randrange(den_mi,
den_ma)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if den:
break<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
frazione(num, den)<BR><BR>def strf(f):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una stringa che rappresenta una frazione.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;num,
den = f<BR>&nbsp;&nbsp;&nbsp;&nbsp;return &quot;{%s / %s}&quot; %
(num, den)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La procedura di test,
che riporto di seguito, &egrave; stata scritta man mano che venivano
create le varie funzioni. Quasi ad ogni nuova funzione, aggiungo una
riga per controllare il suo funzionamento. In questo modo, ogni volta
che aggiungo un pezzo di codice al mio programma lo controllo subito
e, prima di passare ad altro, lo correggo (quanti errori sono
riuscito a mettere in queste poche righe di programma!).</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
test():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esegue un test
sulle varie funzioni di questa libreria.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;a,
b = 42, 56<BR>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;MCD(%s; %s)=%s&quot;
% (a, b, mcd(a, b))<BR>&nbsp;&nbsp;&nbsp;&nbsp;a, b = 18, 12<BR>&nbsp;&nbsp;&nbsp;&nbsp;f
= frazione(a, b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;%s = %s&quot;
% (f, riduci(f))<BR>&nbsp;&nbsp;&nbsp;&nbsp;a=frazione(2,5)<BR>&nbsp;&nbsp;&nbsp;&nbsp;b=frazione(3,4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s + %s = %s&quot; % (a, b, sommaf(a, b))<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s - %s = %s&quot; % (a, b, differenzaf(a, b))<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s * %s = %s&quot; % (a, b, prodottof(a, b))<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s / %s = %s&quot; % (a, b, quozientef(a, b))<BR>&nbsp;&nbsp;&nbsp;&nbsp;c=randf(-10,
10, -10, 10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=randf(-10, 10, -10,
10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Espressione&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s / %s + %s * %s = %s&quot; % \<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(strf(a),
strf(b), strf(c),
strf(d),\<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strf(sommaf(quozientef(a,
b), prodottof(c, d))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Frazione
con divisore nullo:&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
frazione(5, 0)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">L'ultima riga del
programma merita una citazione particolare:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">if
__name__ == &quot;__main__&quot;: test()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">&Egrave; un'istruzione
piuttosto esoterica: in pratica dice:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se questo codice &egrave;
eseguito come programma allora devi eseguire la funzione <KBD><FONT FACE="Bitstream Vera Sans Mono">test()</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma in quale caso questo
codice pu&ograve; essere eseguito <B>non</B> come programma?</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Pu&ograve; succedere,
se viene caricato come libreria, impiego ideale per una collezione di
funzioni.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il precedente programma
di esercitazione di calcolo frazionario pu&ograve; guadagnarne in
semplicit&agrave;. La procedura <KBD><FONT FACE="Bitstream Vera Sans Mono">addizione()</FONT></KBD>
diventa pi&ugrave; semplice:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">from
frazioni02 as fraz<BR><BR>def addizione():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sull'addizione di
frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;giuste=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;sbagliate=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for
i in xrange(NUM_ESERCIZI): # ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f1=fraz.randf(1,
MAX_VAL, 1, MAX_VAL) # primo operando<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f2=fraz.randf(1,
MAX_VAL, 1, MAX_VAL) # secondo operando<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr=fraz.sommaf(f1,
f2) # risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;risposta=raw_input(&quot;%s
+ %s = &quot; % (fraz.strf(f1), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fraz.strf(f2)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
risposta == &quot;%s/%s&quot; % fr:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giusto()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">giuste+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliato(fr)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliate+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;risultati(&quot;addizioni&quot;,
giuste, sbagliate)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">E modificando anche la
procedura sbagliato in questo modo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sbagliato(risultato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni
da svolgare quando la risposta &egrave; sbagliata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Sbagliato, la risposta era: %s/%s&quot; %
risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;c=raw_input(&quot;premi
&lt;invio&gt;&quot;)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">il programma funziona e
risulta pi&ugrave; semplice e pi&ugrave; solido (<KBD>frazioni03.py</KBD>)</P>
<H1 CLASS="western"><A NAME="oggetti"></A>10. Programmazione ad
oggetti</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Abbiamo visto come una
libreria di funzioni ci possa mettere a disposizione, in modo
semplice, il calcolo frazionario. Ma <KBD>Python</KBD> ci permette di
fare di pi&ugrave;: possiamo integrare il calcolo con le frazioni
all'interno del linguaggio in modo da poter utilizzare le nostre
frazioni all'interno di espressioni <KBD>Python</KBD>. Per ottenere
questo dobbiamo creare una classe Frazione dotata di attributi e
metodi (dati e funzioni). Ogni elemento della classe Frazione sar&agrave;
un oggetto Frazione e possieder&agrave; gli attributi presenti nella
classe e sapr&agrave; eseguire i metodi della sua classe.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Prima
di definire la classe riportiamo due funzioni utili per lavorare con
le frazioni:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
mcd(a, b):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Massimo
Comune Divisore tra a e b&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;a=abs(a);
b=abs(b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;while a&lt;&gt;b:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
a&gt;b: a-=b<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
b-=a<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if b==1 or
a==1:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
b<BR>&nbsp;&nbsp;&nbsp;&nbsp;return a</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono"><BR>def
riduci(coppia):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Riduce
una coppia di numeri dividendoli per il loro MCD.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;num,
den = coppia<BR>&nbsp;&nbsp;&nbsp;&nbsp;divisore=mcd(num,
den)<BR>&nbsp;&nbsp;&nbsp;&nbsp;return (num/divisore, den/divisore)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Una
classe &egrave; definita dalla parola riservata classe seguita dal
nome della classe (di solito con la prima lettera maiuscola) e da una
coppia di parentesi che pu&ograve; contenere il nome di una classe
genitore (nel nostro caso la classe base: object):</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">class
Frazione(object):</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Di
seguito (indentati) si elencano gli elementi della classe: attributi
di classe e metodi.</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">OOo=True
# Se True visualizza le frazioni nel formato di<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
OpenOffice.org: &quot;{n over d}&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
se False le visualizza nella forma testuale &quot;n/d&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se voglio che l'output
sia in formato OpenOffice.org dovr&ograve; mettere il valore <KBD>True</KBD>
nella variabile di nome <KBD>OOo</KBD>, se invece <KBD>OOo</KBD>
contiene <KBD>False</KBD>, la frazione verr&agrave; visualizzata nel
formato testo: &ldquo;<KBD>num/den</KBD>&rdquo;</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ogni metodo di una
classe viene definito dalla parola riservata <KBD><FONT FACE="Bitstream Vera Sans Mono">def</FONT></KBD>
seguita dal nome del metodo e da una coppia di parentesi che contiene
come primo parametro un riferimento all'oggetto stesso. Di solito a
questo primo parametro viene dato il nome &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">self</FONT></KBD>&quot;.
Ad esempio:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
fa_qualcosa(self[, &lt;parametri&gt;]):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il metodo fondamentale
di ogni classe &egrave; il metodo <KBD><FONT FACE="Bitstream Vera Sans Mono">__init__(self)</FONT></KBD>.
Pu&ograve; avere altri parametri e viene chiamato quando viene creato
un oggetto di questa classe. Nel nostro caso <KBD><FONT FACE="Bitstream Vera Sans Mono">__init__(self)</FONT></KBD>
assomiglia molto alla funzione frazione che avevamo visto nel
capitolo precedente:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
__init__(self, num, den):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una frazione dati numeratore e denominatore.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Solleva
un'eccezione se il denominatore &egrave; nullo.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Il
denominatore &egrave; sempre positivo.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;La
frazione &egrave; ridotta ai minimi termini.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
den==0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise
ZeroDivisionError<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
num==0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.num=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.den=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
den&gt;0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.num,
self.den = riduci((num,
den))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.num,
self.den = riduci((-num, -den))</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Si possono notare
alcune differenze: 
</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Non restituisce un risultato.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	Immagazzina le informazioni che riceve in due variabili precedute
	da: &quot;<KBD>self</KBD>.&quot;.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm">Da notare che: 
</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm"><KBD><FONT FACE="Bitstream Vera Sans Mono">num</FONT></KBD>
	&egrave; il nome di un parametro, quindi di una variabile locale al
	metodo, variabile che viene eliminata quando il metodo termina.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm"><KBD><FONT FACE="Bitstream Vera Sans Mono">self.num</FONT></KBD>
	&egrave; il nome di un attributo dell'oggetto quindi dura finch&eacute;
	nel programma &egrave; presente l'oggetto a cui si riferisce.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Dopo
aver rieseguito il programma che contiene la classe precedente
possiamo creare una frazione con il comando (dalla shell di Python):</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;f=Frazione(20,
45)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ora possiamo vedere
numeratore e denominatore dell'oggetto <KBD><FONT FACE="Bitstream Vera Sans Mono">f</FONT></KBD>
con il comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
print f.num<BR>4<BR>&gt;&gt;&gt; print f.den<BR>9</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Possiamo ora passare ad
aggiungere i metodi per realizzare tutte le operazioni che ci
servono. Se utilizziamo la convenzione di nomi di <KBD>Python</KBD>
le operazioni che definiamo saranno riconosciute dall'interprete del
linguaggio e verranno chiamate al momento giusto.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
__add__(self, other):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
la somma di questa frazione con un'altra.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num
= self.num*other.den+other.num*self.den<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;den
= self.den*other.den<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(num, den)<BR><BR></FONT>In questo modo, dopo aver eseguito
il programma possiamo creare delle frazioni e utilizzarle all'interno
di espressioni che contengono addizioni:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
from frazioni04 import *<BR>&gt;&gt;&gt; a=Frazione(4, 3)<BR>&gt;&gt;&gt;
b=Frazione(5, 6)<BR>&gt;&gt;&gt; c=a+b<BR>&gt;&gt;&gt; print c<BR>{13
over 6}<BR>&gt;&gt;&gt; c+=a<BR>&gt;&gt;&gt; print c<BR>{7 over 2}</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Si pu&ograve; osservare
che il metodo <KBD>__add__()</KBD> &egrave; una funzione che
restituisce un oggetto <KBD>Frazione</KBD>, il risultato pu&ograve;
quindi essere usato all'interno di espressioni pi&ugrave; complesse.
Con lo stesso meccanismo si possono realizzare le varie operazioni
con le frazioni:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
__neg__(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
l'opposto di una frazione.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(-self.num, self.den)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
__sub__(self, other):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
la differenza di due frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num
= self.num*other.den-other.num*self.den<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;den
= self.den*other.den<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(num, den)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def __mul__(self,
other):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il prodotto di due frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(self.num*other.num, self.den*other.den)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
reciprocof(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il reciproco di una frazione.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(self.den, self.num)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
__div__(self, other):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il quoziente di due frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(self.num*other.den, self.den*other.num)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
ooostr(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Frazione.OOo=True<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
txtstr(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Frazione.OOo=False</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Importante &egrave; il
metodo che trasforma l'oggetto in una stringa. Il metodo con il nome
<KBD><FONT FACE="Bitstream Vera Sans Mono">__str__(self)</FONT></KBD>
verr&agrave; chiamato da <KBD>Python</KBD> ogni volta c'&egrave;
bisogno di convertire in stringa l'oggetto. Dato che io ho bisogno di
generare delle frazioni che vengano rappresentate da OpenOffice.org,
ho pensato a un metodo <KBD><FONT FACE="Bitstream Vera Sans Mono">__str__(self)</FONT></KBD>
che possa utilizzare quel formato o un formato di tipo testuale a
seconda del valore di una variabile modificata dai due metodi:
<KBD><FONT FACE="Bitstream Vera Sans Mono">ooostr()</FONT></KBD> e
<KBD><FONT FACE="Bitstream Vera Sans Mono">txtstr()</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
__str__(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una stringa che rappresenta una frazione.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;La
stringa pu&ograve; essere in formato OpenOffice.org<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o
in un formato testo.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
self.den==1: return str(self.num)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
self.num==0: return '0'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
Frazione.OOo:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;{%s over %s}&quot; % (self.num,
self.den)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;%s/%s&quot; % (self.num, self.den)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
randf(num_mi, num_ma, den_mi, den_ma):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
una frazione casuale.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Il
numeratore &egrave; compreso tra num_mi e num_ma;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Il
denominatore &egrave; compreso tra den_mi e den_ma&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from
random import randrange<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num=randrange(num_mi,
num_ma)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while
True:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
devo creare un<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;den=randrange(den_mi,
den_ma)&nbsp;# <FONT FACE="Bitstream Vera Sans Mono">numeratore</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
den: break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
diverso da zero!<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
Frazione(num, den)<BR><BR>def
test():<BR>&nbsp;&nbsp;&nbsp;&nbsp;a=Frazione(2,5)<BR>&nbsp;&nbsp;&nbsp;&nbsp;b=Frazione(3,4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s + %s = %s&quot; % (a, b, a+b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s - %s = %s&quot; % (a, b, a-b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s * %s = %s&quot; % (a, b, a*b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s / %s = %s&quot; % (a, b, a/b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;c=randf(-10,
10, -10, 10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=randf(-10, 10, -10,
10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Espressione (formato
OOo)&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;%s / %s + %s * %s =
%s&quot; % (a, b, c, d, a/b+c*d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Espressione (formato txt)&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;a.txtstr()<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;%s / %s + %s * %s = %s&quot; % (a, b, c, d, a/b+c*d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Frazione con divisore nullo:&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;f=Frazione(5,
0)<BR><BR>if __name__ == &quot;__main__&quot;: test()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Riprendiamo
l'eserciziario sul calcolo con le frazioni. Questa volta usiamo la
classe <KBD>Frazione()</KBD> e lo realizziamo con una programmazione
orientata agli oggetti (<KBD>OOP</KBD>).</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Incominciamo caricando
la libreria <KBD><FONT FACE="Bitstream Vera Sans Mono">frazioni04</FONT></KBD>
con il nome di <KBD><FONT FACE="Bitstream Vera Sans Mono">fraz</FONT></KBD>:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">import
frazioni04 as fraz</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Le
costanti restano le stesse:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">NUM_ESERCIZI=3<BR>MAX_VAL=11</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il ciclo principale
viene modificato, perch&eacute;, prima del menu, si prepara i quattro
esercizi e, a seconda della scelta dell'utente esegue il metodo <KBD><FONT FACE="Bitstream Vera Sans Mono">run()</FONT></KBD>
di uno o dell'altro esercizio:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
eser_fraz():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;
Esercitatore di calcolo frazionario.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">f=fraz.Frazione(1,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;f.txtstr()<BR>&nbsp;&nbsp;&nbsp;&nbsp;add=Addizione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;sot=Sottrazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;mol=Moltiplicazione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;div=Divisione()<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
True:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu() #
Stampa il menu<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scelta=raw_input(&quot;La
tua scelta: &quot;) # legge la scelta<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
scelta==&quot;0&quot;: break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
con 0 termina il ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;1&quot;: add.run()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
esegue<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;2&quot;: sot.run() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
le varie scelte...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;3&quot;: mol.run()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif
scelta==&quot;4&quot;: div.run()<BR><BR>def menu():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Menu
di scelta degli esercizi.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;<BR>Frazioni<BR><BR>Scegli il tipo di esercizi:<BR>1:
Addizione<BR>2: Sottrazione<BR>3: Moltiplicazione<BR>4: Divisione<BR><BR>0:
Fine<BR>&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Qui
si definisce cosa &egrave; e come deve comportarsi un esercizio.
Esercizio() &egrave; una classe generica quindi non definisce tutto,
avr&agrave; alcuni metodi che non fanno niente, ma che verranno
precisati nei suoi discendenti:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">class
Esercizio(object):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Generico
esercizio.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il metodo principale &egrave;
<KBD>run()</KBD>, che per <KBD>NUM_ESERCIZI</KBD> volte:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	sceglie due frazioni,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
	calcola il risultato,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">presenta
	l'esercizio,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">attende la
	risposta,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">la confronta con
	la risposta esatta e, a seconda del risultato d&agrave; un feedback,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">alla fine d&agrave;
	un resoconto dei risultati ottenuti.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
run(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sull'addizione di
frazioni.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giuste=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliate=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for
i in xrange(NUM_ESERCIZI): # ciclo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.f1=fraz.randf(1,
MAX_VAL, 1, MAX_VAL) # 1o operando<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.f2=fraz.randf(1,
MAX_VAL, 1, MAX_VAL) # 2o operando<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr=self.risultato()
#
risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;risposta=raw_input(self.domanda())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
risposta ==
str(fr):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.giusto()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giuste+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sbagliato(fr)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbagliate+=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.risultati(self.nome(),
giuste, sbagliate)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questo metodo funziona
richiamando alcuni altri metodi della classe <KBD><FONT FACE="Bitstream Vera Sans Mono">Esercizio()</FONT></KBD>.
Alcuni di questi non fanno niente, verranno implementati dalle classi
derivate da <KBD><FONT FACE="Bitstream Vera Sans Mono">Esercizio()</FONT></KBD>,
(sono quelli che come unica istruzione hanno: <KBD><FONT FACE="Bitstream Vera Sans Mono">pass</FONT></KBD>)
altri invece sono gi&agrave; funzionanti:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
risultato(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il risultato dell'operazione.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cambia
a seconda dell'operazione da eseguire.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
domanda(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
la domanda dell'esercizio.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cambia
a seconda dell'operazione da eseguire.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
nome(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Restituisce
il tipo di esercizi.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cambia
a seconda dell'operazione da eseguire.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
giusto(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni
da svolgare quando la risposta &egrave; giusta.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Bravo, la risposta &egrave; giusta!&quot;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
sbagliato(self, risultato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Azioni
da svolgare quando la risposta &egrave; sbagliata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Sbagliato, la risposta era: %s&quot; %
risultato<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=raw_input(&quot;premi
&lt;invio&gt;&quot;)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
risultati(self, tipo, g, s):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Visualizza
i risultati ottenuti.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;\nNelle %s, hai ottenuto %s%% di risposte esatte!\n&quot;
\<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% (tipo,
100*g/(g+s))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=raw_input(&quot;premi
&lt;invio&gt; per continuare&quot;)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La classe <KBD><FONT FACE="Bitstream Vera Sans Mono">Esercizio()</FONT></KBD>
costituisce una struttura che sarebbe funzionante se facessero
qualcosa i suoi tre metodi: <KBD><FONT FACE="Bitstream Vera Sans Mono">risultato()</FONT></KBD>,
<KBD><FONT FACE="Bitstream Vera Sans Mono">domanda()</FONT></KBD> e
<KBD><FONT FACE="Bitstream Vera Sans Mono">nome()</FONT></KBD>. Dalla
classe <KBD><FONT FACE="Bitstream Vera Sans Mono">Esercizio()</FONT></KBD>
deriviamo altre classi che la completano fornendo proprio questi tre
metodi. Queste classi discendenti non devono preoccuparsi di quello
che in <KBD><FONT FACE="Bitstream Vera Sans Mono">Esercizio()</FONT></KBD>
funziona gi&agrave;, devono solo realizzare quello che manca (o che
si vuole funzioni in modo diverso).</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">class
Addizione(Esercizio):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sull'addizione di frazioni.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La classe <KBD><FONT FACE="Bitstream Vera Sans Mono">Addizione()</FONT></KBD>
&egrave; derivata dalla classe <KBD><FONT FACE="Bitstream Vera Sans Mono">Esercizio()</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il metodo <KBD>risultato</KBD>
calcola la somma delle due frazioni che si trovano in <KBD><FONT FACE="Bitstream Vera Sans Mono">self.f1</FONT></KBD>
e <KBD><FONT FACE="Bitstream Vera Sans Mono">self.f2</FONT></KBD>:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
risultato(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
self.f1+self.f2</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il metodo <KBD>domanda</KBD>
restituisce la stringa che contiene la domanda che verr&agrave; posta
all'utente:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
domanda(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;%s + %s = &quot; % (self.f1, self.f2)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Il
metodo nome restituisce il nome dell'operazione:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
nome(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;addizioni&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">In
modo del tutto analogo si costruiscono le altre operazioni:</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; font-weight: medium"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">class
Sottrazione(Esercizio):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla sottrazione di frazioni.&quot;&quot;&quot;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
risultato(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
self.f1-self.f2<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
domanda(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;%s - %s = &quot; % (self.f1, self.f2)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
nome(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;sottrazioni&quot;<BR><BR>class
Moltiplicazione(Esercizio):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla moltiplicazione di frazioni.&quot;&quot;&quot;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
risultato(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
self.f1*self.f2<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
domanda(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;%s * %s = &quot; % (self.f1, self.f2)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
nome(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;moltiplicazioni&quot;<BR><BR>class
Divisione(Esercizio):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Esercizi
sulla divisione di frazioni.&quot;&quot;&quot;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
risultato(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
self.f1/self.f2<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
domanda(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;%s / %s = &quot; % (self.f1, self.f2)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
nome(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&quot;divisioni&quot;<BR><BR>eser_fraz()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Le ultime classi, mi
sembrano cos&igrave; semplici, che non sono neppure riuscito a
scrivere dei commenti che non fossero banali.</P>
<H1 CLASS="western"><A NAME="licenza"></A>11. Licenza</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Pur assumendomi tutte
le responsabilit&agrave; sulle sciocchezze che ho scritto in questo
testo, devo riconoscere che, tutto quello che so, mi &egrave; stato
trasmesso con passione, generosit&agrave; e pazienza da altri.
Cosciente di questo, metto a disposizione di chiunque sia interessato
quello che ho scritto, nella speranza che possa essere utile.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Le librerie pycart,
pyplot, pyturtle e pyig, tutti gli esempi che le completano, il
manuale e gli altri testi che ne spiegano l'uso, vengono cedute tutte
con licenza GNU Free Documentation License (<A HREF="http://www.gnu.org/">http://www.gnu.org</A>)
che vi permette di:</P>
<OL START=0>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Utilizzare
	questo documento per qualunque scopo, senza vincoli sul suo
	utilizzo.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Modificare
	il documento e adattarlo alle vostre esigenze.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Ridistribuire
	copie del documento originale o modificato.</FONT></FONT></P>
</OL>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><B>con le seguenti
condizioni:</B></P>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR>
</P>
<OL START=0>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Sia
	sempre distribuito con questa licenza anche ogni lavoro derivato, in
	tutto o in parte, da esso.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Sia
	citato l'autore originale e il sito di provenienza.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Non
	venga snaturato nella sostanza o nella forma il contenuto originale.</FONT></FONT></P>
</OL>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm">Naturalmente
sar&agrave; per me di grande conforto e consolazione ricevere
commenti, suggerimenti o anche critiche...</P>
<H1 CLASS="western"><A NAME="bibliografia"></A>12. Bibliografia</H1>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Un manualetto
	sulle librerie pycart.py, pyplot.py, pyturtle.py e pyig.py, si trova
	in /opt/doc/pygraph.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Per quanto
	riguarda Python il sito italiano di riferimento &egrave;
	<A HREF="http://www.python.it/">www.python.it</A>. Qui si possono
	trovare manuali, articoli, presentazioni, esempi e link a materiali
	di tutti i tipi originali, tradotti o in inglese.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
</BODY>
</HTML>